Спринт 2/18 → Тема 5/6: Требования к коду → Урок 3/7
Аннотация типов. Простые типы
Никто не застрахован от ошибок в коде. Иногда ценой ошибок бывает просто нечитаемость кода, а иногда — разбившийся космический корабль.
Одна из возможных проблем — ошибка в типах данных.
Python поддерживает динамическую типизацию. Это значит, что переменная получает свой тип не в момент её объявления, а когда ей присваивается значение. Таким образом, в разных участках кода одна и та же переменная может иметь разный тип.
PYTHON
Обычно это удобно, но иногда становится отличным способом «выстрелить себе в ногу».
Посмотрите на поведение простой функции:
КодPYTHON
Но никто не мешает передать в функцию
we_crash_all() булеву переменную (разработчик вполне может не учесть возможность такого события):КодPYTHON
Ошибка! В Python нельзя просто взять и сложить
str c bool. Функция ожидала на вход строку, а пришло булево значение.Другой пример: функция
speak_up() принимает на вход коллекцию и ожидает, что у неё есть методы pop() и append(). Второй метод доступен только для списков, но ничто не мешает случайно или намерено в ходе написания программы передать функции, например, множество. Запустите код и посмотрите, что получится:
КодPYTHON
Привет,
name, мы всё сломали.Если кода немного — ошибку легко предотвратить: каждое значение — как на ладони. Но когда в проекте будет взаимодействовать множество функций, классов и переменных — несоответствие типов может стать серьёзной проблемой.
Type Hints: аннотация типов данных
Чтобы держать типизацию под контролем — применяют аннотации типов данных (Type Hints, дословный перевод с английского — «подсказки типов»). Это явное указание типа ожидаемых данных при объявлении переменных, классов и функций.
PYTHON
При выполнении кода интерпретатор Python игнорирует аннотации типов и не выдаёт ошибок, если типизация нарушена:
PYTHON
Python не обратит внимания на это несоответствие и продолжит выполнять код как ни в чём не бывало. Аннотация будет проигнорирована, переменная будет воспринята Python как строка.
Однако Python не оставляет аннотации совсем без внимания: он считывает Type Hints и сохраняет их в словарь
__annotations__. Содержимое этого словаря можно вывести на экран:PYTHON
Синтаксис аннотирования встроенных типов данных
В простейшем случае аннотация содержит непосредственно ожидаемый тип данных:
str, int, float или bool. Дополнительно применяется обозначение None, «ничего»: например, если функция ничего не возвращает — тип возвращаемых данных указывается как None.Type Hints для переменных
Переменные в Python обычно аннотируются так:
PYTHON
В Python есть и другой синтаксис аннотирования, вы можете встретить его в работе. Этот синтаксис устарел, но вполне валиден и нормально обрабатывается пакетами для проверки типов:
PYTHON
Type Hints для функций
В функциях указывают Type Hints для аргументов и возвращаемого значения:
PYTHON
Ну и кому нужны эти Type Hints?
Если Python игнорирует аннотации типов, а разработчик и без аннотаций старается отслеживать корректность кода — какой прок в этих Type Hints?
Аннотации типов могут считываться сторонними программами, предназначенными для проверки типизации. В случае обнаружения ошибок эти программы сообщат разработчику о проблемах.
Есть четыре популярных пакета для проверки типов:
- Mypy активно разрабатывается, в частности, Гвидо ван Россумом, создателем Python. Один из самых популярных пакетов для работы с аннотациями в Python.
- Pyre — альтернатива mypy.
- Pytype — анализатор от Google.
- Pylance — разработан корпорацией Майкрософт.
Эти пакеты могут работать и в терминале, и в редакторе кода (например, как Pylance в VSCode). Такие пакеты подсвечивают некорректный код и выдают подсказки в процессе набора текста.
Проверка аннотации типов через консоль
Теперь можно посмотреть, как работает проверка типизации. Скопируйте этот код во временный файл и сохраните его под именем temp.py (или любым другим):
PYTHON
Для проверки файлов на соответствие указанным аннотациям установите пакет
mypy в ваше виртуальное окружение:BASH
Перейдите в директорию с файлом temp.py и запустите этот файл утилитой
mypy:BASH
Файл проверен, ошибок в типизации не найдено.
Отредактируйте и сохраните код в файле temp.py:
PYTHON
Снова запустите файл в
mypy:BASH
Утилита
mypy сделала своё дело:- обнаружила, что в функцию передали число, хотя ожидалась строка;
- указала на суть ошибки и на строку, в которой допущена ошибка.
Проверка типизации через редактор кода
Вызовите командную строку VSCode (Ctrl+Shift+P), введите в поисковую строку текст Python: Select Linter, нажмите Enter, в выпадающем списке выберите линтер
mypy:Теперь
mypy будет постоянно наблюдать за кодом, который вы пишете, а при виде ошибки будет нервничать и, не ожидая выполнения кода, сообщать о проблеме: подчеркнёт ошибку в коде и покажет детальное описание в панели «Проблемы» (Problems).Стоит рассматривать инструмент для проверки типов как дополнительный
линтер, необязательный, но полезный.Ещё один шаг к аккуратному коду сделан. Пока больше теоретический; значит, пора практиковаться.